#include "powerManager.h"


//正常模式
#define POWER_NORMAL 0      

//准备进入停机模式
#define POWER_PREPARE_SLEEP 1

//停机模式
#define POWER_SLEEP 2

//正在唤醒模式
#define POWER_WAKING 3


u8 systemRunMode=0;




//休眠前执行的全局函数指针
PMCallback g_before_sleep=0;

//唤醒后执行的全局函数指针
PMCallback g_after_wakeup=0;


//设置休眠前执行的函数指针
void PM_Set_Before_Sleep_Callback(PMCallback callback){
    g_before_sleep=callback;
}

//设置唤醒后执行的函数指针
void PM_Set_After_Wakeup_Callback(PMCallback callback){
    g_after_wakeup=callback;
}



//-------------- 中断函数 ----------------------

//准备进入睡眠模式
void PM_PrepareToSleep_int(){
    systemRunMode=POWER_PREPARE_SLEEP;      
}


//外部中断函数处理,当返回TRUE时，中断函数必需立即返回
BOOL PM_EXTIHandle_int(){
    if(systemRunMode==POWER_NORMAL)return FALSE;        //正常模式

    //从睡眠中唤醒
    if(systemRunMode==POWER_SLEEP){
        systemRunMode=POWER_WAKING;     //设置为正在唤醒状态，让主循环工作
        return TRUE;
    }

    return TRUE;    //其他模式的中断函数不应处理任何工作
}



//-------------- 主循环函数-----------------------


void PM_EnterStopMode(){    
    //进入停机模式
    systemRunMode=POWER_SLEEP;

    //电压控制，中断唤醒
	PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);
}



//主循环调用函数，当返回TRUE时主循环必需直接返回(return)
BOOL PM_Working_loop(){
    switch(systemRunMode){
        case POWER_NORMAL:
        return FALSE;    //正常状态

        case POWER_PREPARE_SLEEP:
        //执行休眠前事件
        if(g_before_sleep!=0)g_before_sleep();
        //进入睡眠
        PM_EnterStopMode();
        return TRUE;

        case POWER_SLEEP:
        break;

        case POWER_WAKING:
        //从睡眠中唤醒，做系统恢复工作
        SystemInit();

        //执行唤醒后事件
        if(g_after_wakeup!=0)g_after_wakeup();

        //恢复为正常模式
        systemRunMode=POWER_NORMAL;

        return TRUE;
    }
    return TRUE;
}







